package com.hop.thread.safe;

/**
 * 取钱线程
 * @author Administrator
 *
 */
public class DrawMoneyRunnable implements Runnable{
	
	private Account account;
	
	private double drawAmount;
	
	public DrawMoneyRunnable(Account account,double drawAmount){
		super();
		this.account = account;
		this.drawAmount = drawAmount;
	}
	
	/**
	 * 模拟取钱过程
	 * 不进行同步会对于一张只有1000余额的银行卡，你们一共可以取出1400，这显然是有问题的
	 * 对共享资源进行访问的方法定义中加上synchronized关键字修饰，使得此方法称为同步方法
	 * 当thread1执行到//1处代码时，判断条件为true，
	 * 此时CPU切换到thread2，执行//1处代码，发现依然为真，然后执行完thread2，接着切换到thread1，接着执行完毕。
	 * 此时，就会出现上述结果。
	 * 讲到线程安全问题，其实是指多线程环境下对共享资源的访问可能会引起此共享资源的不一致性。
	 * 因此，为避免线程安全问题，应该避免多线程环境下对此共享资源的并发访问
	 */
//	public void run(){
	public synchronized void run(){
//		double balance = account.getBalance();
		if(account.getBalance() >= drawAmount){
			double balance = account.getBalance()-drawAmount;
			System.out.println("取款成功，取出钱数为："+drawAmount+"元");
			account.setBalance(balance);
			System.out.println("余额为："+balance+"元");
		}else{
			System.out.println("账户余额不足！！");
		}
	}
}
